package com.quanxiaoha.weblog.common.domain.mapper;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.quanxiaoha.weblog.common.domain.dos.UserBehaviorDO;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 用户行为数据Mapper
 */
public interface UserBehaviorMapper extends BaseMapper<UserBehaviorDO> {

    /**
     * 根据用户ID查询行为记录
     * @param userId 用户ID
     * @return 行为记录列表
     */
    default List<UserBehaviorDO> selectByUserId(Long userId) {
        LambdaQueryWrapper<UserBehaviorDO> wrapper = Wrappers.<UserBehaviorDO>lambdaQuery()
                .eq(Objects.nonNull(userId), UserBehaviorDO::getUserId, userId)
                .orderByDesc(UserBehaviorDO::getCreateTime);
        return selectList(wrapper);
    }

    /**
     * 根据文章ID查询行为记录
     * @param articleId 文章ID
     * @return 行为记录列表
     */
    default List<UserBehaviorDO> selectByArticleId(Long articleId) {
        LambdaQueryWrapper<UserBehaviorDO> wrapper = Wrappers.<UserBehaviorDO>lambdaQuery()
                .eq(Objects.nonNull(articleId), UserBehaviorDO::getArticleId, articleId)
                .orderByDesc(UserBehaviorDO::getCreateTime);
        return selectList(wrapper);
    }

    /**
     * 查询用户对特定文章的行为
     * @param userId 用户ID
     * @param articleId 文章ID
     * @param behaviorType 行为类型
     * @return 行为记录
     */
    default UserBehaviorDO selectByUserAndArticle(Long userId, Long articleId, Integer behaviorType) {
        LambdaQueryWrapper<UserBehaviorDO> wrapper = Wrappers.<UserBehaviorDO>lambdaQuery()
                .eq(Objects.nonNull(userId), UserBehaviorDO::getUserId, userId)
                .eq(Objects.nonNull(articleId), UserBehaviorDO::getArticleId, articleId)
                .eq(Objects.nonNull(behaviorType), UserBehaviorDO::getBehaviorType, behaviorType);
        return selectOne(wrapper);
    }

    /**
     * 查询与指定用户有相似行为的用户（简化版本）
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 相似用户ID列表
     */
    default List<Long> selectSimilarUsers(Long userId, int limit) {
        // 简化实现：查询所有其他用户的行为记录
        LambdaQueryWrapper<UserBehaviorDO> wrapper = Wrappers.<UserBehaviorDO>lambdaQuery()
                .ne(UserBehaviorDO::getUserId, userId)
                .orderByDesc(UserBehaviorDO::getBehaviorScore)
                .orderByDesc(UserBehaviorDO::getCreateTime);

        List<UserBehaviorDO> otherUserBehaviors = selectList(wrapper);
        return otherUserBehaviors.stream()
                .map(UserBehaviorDO::getUserId)
                .distinct()
                .limit(limit)
                .collect(Collectors.toList());
    }
}
